package com.itheima.dfs;

import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.itheima.wemedia.pojo.WmMaterial;
import com.github.tobato.fastdfs.domain.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.itheima.common.constants.SystemConstants;
import com.itheima.common.exception.LeadNewsException;
import com.itheima.common.util.RequestContextUtil;
import com.itheima.common.vo.ResultVo;
import com.itheima.wemedia.fagin.WemediaFegin;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/dfs")
@Slf4j
public class FileController {
    //注入文件处理的对象
    @Autowired
    private FastFileStorageClient client;
    @Autowired
    private FdfsWebServer fdfsWebServer;
    //注入远程调用对象
    @Autowired
    private WemediaFegin wemediaFegin;
    @PostMapping("/upload")
    public ResultVo upload(MultipartFile multipartFile)  {
        try {
            //获取请求头信息是否是从自媒体网关过来的请求
            String header = RequestContextUtil.getHeader(SystemConstants.USER_HEADER_FROM);
            //判断请求头是否有数据，没有则抛出异常
            if (StringUtils.isEmpty(header)){
                throw new LeadNewsException("拒绝上传");
            }
            //获取参数文件的后缀名
            String f = StringUtils.getFilenameExtension(multipartFile.getOriginalFilename());
            //传文件传入的参数1：文件输入流，参数二：文件大小，参数三：文件的后缀名
            StorePath storePath = client.uploadFile(multipartFile.getInputStream(), multipartFile.getSize(), f, null);
            //获取上传的文件FileId
            String fullPath = storePath.getFullPath();
            //获取文件的url
            String url = fdfsWebServer.getWebServerUrl();
            //拼接文件id和url获取查询文件的完整请求路径
            String path = url + fullPath;
            //获取用户id
            Long userId = RequestContextUtil.getUserId();
            //判断是否是从为微服务网关过来的请求是则远程掉用自媒体微服务进行操作
            if ("wemedia-pic".equals(header)) {
                addWmMaterial(userId, fullPath);
            }
            //返回获取上传文件路径
            return ResultVo.ok(Collections.singletonMap("url",path));
        } catch (IOException e) {
            log.error("文件上传失败{}",multipartFile.getOriginalFilename(),e);

        }
        return ResultVo.bizError("文件上传失败！");
    }
    /**
     * 远程调用从fds下载图片接口
     * @param list 接收传入的文件id集合
     * @return 返回下载的图片字节数组集合
     */
    @ApiOperation("远程调用从fds下载图片接口")
    @PostMapping("/api/dfsFeign")
    private ResultVo<List<Byte[]>> findFile(@RequestBody List<String> list){
        //判断集合是否为空，为空则返回null
        if (CollectionUtils.isEmpty(list)){
           return null;
        }
        //创建一个下载参数需要的类
        DownloadByteArray downloadByteArray = new DownloadByteArray();
        //创建一个可以获取gruop和path的类

        //遍历集合，进行下载
        List<byte[]> collect = list.stream().map(s -> {
            StorePath storePath = StorePath.parseFromUrl(s);
            byte[] bytes = client.downloadFile(storePath.getGroup(), storePath.getPath(), downloadByteArray);
            return bytes;
        }).collect(Collectors.toList());
        //返回获取到的图片字节数组
        return ResultVo.ok(collect);
    }

    private void addWmMaterial(Long userId, String fullPath) {
        //根据用户id远程调用自媒体微服务进行查询数据
        //ResultVo resultVo = wemediaFegin.findById(userId);
        //判断远程调用是否成功，不成功则抛出异常
        /*if (!resultVo.isSuccess()){
            log.error("远程调用根据用户id查询素材微服务失败，用户id{}",userId);
            throw new LeadNewsException("远程调用查询素材微服务失败！");
        }*/
        //获取查询到的素材对象，为空则执行远程调用自媒体微服务进行添加操作
        //Object wmMaterial =  resultVo.getData();
        //if (wmMaterial==null){
            //创建一个素材对象
            WmMaterial addWmMaterial = new WmMaterial();
            //添加数到素材对象中
            addWmMaterial.setUserId(userId);
            addWmMaterial.setUrl(fullPath);
            addWmMaterial.setCreatedTime(LocalDateTime.now());
            //素材类型0是图片，1是视频
            addWmMaterial.setType(0);
            //是否收藏该素材，0是不收藏，1是收藏该图片
            addWmMaterial.setIsCollection(0);
            //调用自媒体微服务添加素材对象到数据库
            ResultVo result = wemediaFegin.add(addWmMaterial);
            //判断数据是否添加成功，不成功则抛出异常
            if (!result.isSuccess()){
                log.error("远程调用自媒体微服务添加素材异常，用户id：{}",userId);
                throw new LeadNewsException("远程调用自媒体微服务添加素材失败");
            }
        }



}

/*}*/
